/*
  快速排序
  题目描述
    使用快速排序的方法，实现对 a 数组下标 l ∼ r 之间的元素进行 从大到小 排序的功能。
  输入格式
    输入共 3 行。
    第一行输入一个整数 n，表示序列的长度。
    第二行输入 n 个整数，对应 a[1] ~ a[n] 之间的 n 个整数。
    第三行输入二个整数, 对应 l, r。
  输出格式
    输出一行，按从小到大的顺序输出数组 a 下标 l~r 之间的元素。
  输入数据 1
    5
    15 2 67 3 12
    1 3
  输出数据 1
    2 15 67
*/

#include <bits/stdc++.h>

using namespace std;

int a[1000010] = {};

/*
  使用快速排序的方法，实现对整形数组 a 的下标 s∼e 之间的元素进行排序
  说明:
    1). 快速排序是分治算法的一种应用。分支算法通常使用递归的方法编码
    2). 算法复杂度对比
          快速排序排序法，对 n 个数进行排序的算法复杂度为 O(nlong(n))
          使用快速排序法，求第 k 小的数的算法复杂度为 O(n)；
*/
void fast_sort(int s, int e) {
    int i = s, j = e; // i, j 分别对左右指针
    int x = a[s];     // 基准值
    while (i <= j) {
        // 左指针从左往右，查找第一个 "目前在左半部分但应属于右半部分的数"
        while (i <= j && a[i] < x) { // 注意: 这里将等于"基准值"的数也移到另一部分!
            i++;
        }
        // 右指针从右往左，查找第一个 "目前在右半部分但应属于左半部分的数"
        while (i <= j && a[j] > x) { // 注意: 这里将等于"基准值"的数也移到另一部分!
            j--;
        }
        if (i <= j) { // 表明已经找到需要交换的一对数!
            // 将 "目前在左半部分但应属于右半部分的数" 和 "目前在右半部分但应属于左半部分的数" 进行互换
            swap(a[i], a[j]);
            i++;
            j--;
        }
    }
    if (i < e) {   // 右半部分长度不为 0，继续用快速排序法对右半部分进行排序
        fast_sort(i, e);
    }
    if (j > s) {  // 左半部分长度不为 0，继续用快速排序法对左半部分进行排序
        fast_sort(s, j);
    }
}

int main() {
    int n;
    int s;
    int e;

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    cin >> s >> e;
    fast_sort(s, e);

    for (int i = s; i <= e; i++) {
        cout << a[i] << " ";
    }

    return 0;
}